#ifndef SPEED_DEVICE_H
#define SPEED_DEVICE_H

#include "user_global.h"

extern bit pending_action;//新动作
extern bit is_left_side;               // 左侧板, address = 0x0B

#define X_DIR_OUTPUT(dir)   (is_left_side ? !(dir) : (dir)) // X方向位输出
#define Y_DIR_OUTPUT(dir)   (!(dir))    // Y方向位输出

#define IO_X_STEP(n)          (n)?gpio_bit_write(GPIOA,GPIO_PIN_2,SET):gpio_bit_write(GPIOA,GPIO_PIN_2,RESET)
#define IO_X_DIR(n)           (n)?gpio_bit_write(GPIOA,GPIO_PIN_3,SET):gpio_bit_write(GPIOA,GPIO_PIN_3,RESET)
#define IO_Y_STEP(n)          (n)?gpio_bit_write(GPIOB,GPIO_PIN_7,SET):gpio_bit_write(GPIOB,GPIO_PIN_7,RESET)
#define IO_Y_DIR(n)           (n)?gpio_bit_write(GPIOB,GPIO_PIN_6,SET):gpio_bit_write(GPIOB,GPIO_PIN_6,RESET)

#define X_AT_HOME   (!gpio_input_bit_get(GPIOB,GPIO_PIN_15))
#define Y_AT_HOME   (!gpio_input_bit_get(GPIOB,GPIO_PIN_13))   


#define slave_flag &rw_bit
// 电机碰到原点后运行的步数
#define X_RESET_BUFFER_STEP      100  // X电机复位时, 经过原点后继续运行的步数

// 电机碰到原点后运行的步数
#define Y_RESET_BUFFER_STEP      100  // X电机复位时, 经过原点后继续运行的步数

//

// server_status定义
enum STATUS_CODE
{
    STATUS_IDLE = 0,
    STATUS_BUSY = 0xFFFF
};
#define STATUS_COMMUNICATION_ERROR(addr)        (((ushort)(addr) << 8) | XY_STATUS_COMM_ERROR)
#define STATUS_COMMUNICATION_ERROR(addr)        (((ushort)(addr) << 8) | XY_STATUS_COMM_ERROR)

// 吸样/加样标志位
#define REAGENT_FLAG_IGNORE_PROBE_ERROR         0x0100  // 忽略液面探测错误
#define REAGENT_FLAG_HOLD_POSITION              0x0200  // 加样完后Z待在原位
#define REAGENT_FLAG_NO_DELAY                   0x0400  // 加样后Z不要等待
#define REAGENT_FLAG_NO_REVERSAL                0x0800  // 清洗完泵不逆转

void Update_IO(void);
void Update_Rinse_Alarm(void);
bit Move_XY_To(long x, long y, ushort xspeed, ushort yspeed);
void Process_Action(void);

extern uchar reset;
extern uchar fling;
void X_Init_Move(bit ignore_step_left);
void Y_Init_Move(bit ignore_step_left);
#endif

